home *** CD-ROM | disk | FTP | other *** search
- {
- DP> Howdy everyone, my computer science class at my high school is trying
- DP> to work on the most efficient way to find all the pythagorean triples
- DP> from 1 to a certain number, then dump them into a text file. Currently,
- DP> the fastest anyone has managed to get is 57 seconds for 1 to 1000. The
- DP> program would be considerably faster, but we are removing all duplicates
- DP> and dilations. In case you're wondering, a dilation would be: 6 8 10,
- DP> which is just a dilation of 3 4 5. IF anyone has any ideas (actual code
- DP> would be nice) to help improve the speed of our programs, please drop me
- DP> a message!!! Thanks a lot.
-
- This kinda piqued my curiosity so I tried just what you were describing.
- I'm not much of a math wiz, but I came up with the following... it
- doesn't check for dilations... too lazy for that now but I looked
- at the pattern of dilations and there is a pretty definite pattern, so
- it shouldn't be too hard to put in.
-
- The output is not neat or anything, and it uses DOS redirection to
- output the numbers but I clocked it at 4 seconds on a DX2/66 in a full
- screen DOS session under windows 3.1 so it's pretty fast even for not
- checking dilations...
-
- The next message contains the rest of the code...
-
-
- { DEFINE DEBUG} { turn this on for debugging work }
- {$A-} { turn off alignment }
- {$B+} { complete boolean evaluations }
-
- {$IFNDEF DEBUG} { if not debugging program turn off }
- {$D-} { no debug info }
- {$R-} { turn off range checking }
- {$ELSE} { else }
- {$D+} { turn on debug info }
- {$R+} { turn on range checking }
- {$ENDIF} { end conditional if }
-
- {$F+} { force far calls }
- {$G+} { enable 286 instructions }
- {$N+} { enable coprocessor }
- {$P-} { no open string }
- {$V+} { strict string checking }
-
- {-----------------------------------------------------------------------}
- { Program : Triples }
- { Last Modified: 03-23-96 }
- { Purpose : To find all the pythagorean triples from 1 to 1000 }
- {-----------------------------------------------------------------------}
- Program PythagoreanTriples;
- Uses Crt,Timer; { timer code at the END of this program !! }
-
-
- {-----------------------------------------------------------------------}
- { global constants }
- {-----------------------------------------------------------------------}
- Const
- MaxNum = 1000; { maximum number to find triple for }
-
- {-----------------------------------------------------------------------}
- { global variables }
- {-----------------------------------------------------------------------}
- Var
- ICtr, ICtr2: Word; { iteration counters }
- Result: extended;
- {-----------------------------------------------------------------------}
- { main code here }
- {-----------------------------------------------------------------------}
- Begin { begin main block }
- assign(output, '');
- rewrite(output);
- ClrScr; { clear the screen }
- Clockon;
- For ICtr := 1 to MaxNum Do { go thorugh numbers }
- For ICtr2 := ICtr to MaxNum Do { go through numbers }
- Begin { begin ICtr2 for loop }
- Result := Sqrt(ICtr*ICtr + ICtr2 * ICtr2);
- if (Result - INT(Result) = 0)then
- Writeln(output,ICtr,' ', ICtr2:10,' ', Result);
- End; { end ICtr2 for loop }
- clockoff;
- End. { end main block }
- -------------------------------------------------------------------------
- here is the timer unit you need.
-
- { Timing unit for optomizing code }
- unit TIMER;
-
- interface
-
- procedure clockon;
- procedure clockoff;
-
- implementation
- uses dos;
-
- var H,M,S,s100:word;
- startclock,stopclock:real;
-
- procedure clockon;
- begin
- gettime(h,m,s,s100);
- startclock := (H*3600)+(M*60)+S+(S100 / 100);
- Writeln('Start time = ',Startclock:0:2);
- end;
- procedure clockoff;
- begin
- gettime(h,m,s,s100);
- stopclock := (H*3600)+(M*60)+S+(S100 / 100);
- writeln;
- writeln('Stop time = ',stopclock:0:2);
- writeln('Elapsed time = ',(stopclock-startclock):0:2);
- end;
-
- begin
- end.